//
// Created by 28365 on 2025/3/9.
//

#ifndef ODUPDATERSDK_FILE_H
#define ODUPDATERSDK_FILE_H

#include <string>
#include <filesystem>
#include <fstream>

using namespace std;
namespace fs = std::filesystem;

class File {

private:
    /**
     * 文件路径
     */
    fs::path path;

    /**
     * 输出流
     */
    ofstream* outStream = nullptr;

    /**
     * 输入流
     */
    ifstream* inStream = nullptr;
    
public:

    explicit File(const string& path);

    /**
     * 判断文件是否存在
     * @return 存在返回true
     */
    bool isExists();

    /**
     * 打开文件输出流，如果文件不存在将自动创建，通过new创建输出流，需要手动delete
     * @return 文件输出流
     */
    ofstream *openOutStream();

    /**
     * 打开文件输出流，如果文件不存在将自动创建，通过new创建输出流，需要手动delete
     * @param mode 文件模式
     * @return 文件输出流
     */
    ofstream *openOutStream(_Ios_Openmode mode);

    /**
     * 打开文件输入流，通过new创建输入流，需要手动delete
     * @return 文件输入流
     */
    ifstream *openInStream();

    /**
     * 打开文件输入流，通过new创建输入流，需要手动delete
     * @param mode 文件模式
     * @return 文件输入流
     */
    ifstream *openInStream(_Ios_Openmode mode);

    /**
     * 删除文件
     * @return 成功删除返回true
     */
    bool deleteFile();

    /**
     * 创建目录
     */
    bool mkdirs();

    /**
     * 创建父级目录
     * @return
     */
    bool mkParentDirs();

    /**
     * 是否存在父级目录
     */
    bool existsParentDir();

    fs::path getAbsolutePath();

    virtual ~File();

};


#endif //ODUPDATERSDK_FILE_H
